﻿''' <summary>
''' Form base dùng để hiển thị thông tin chi tiết của một bản ghi
''' </summary>
''' <remarks>Nguyễn Huy Thường added on 04/06/2011</remarks>
Public Class frmBaseDetail

#Region "Property"

    ''' <summary>
    ''' Thuộc tính lưu trạng thái hoạt động
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private m_eActionMode As clscommon.ActionMode
    Public Property ActionMode() As clscommon.ActionMode
        Get
            Return m_eActionMode
        End Get
        Set(ByVal value As clscommon.ActionMode)
            m_eActionMode = value
        End Set
    End Property

    ''' <summary>
    ''' Thuộc tính lưu đối tượng xử lý các thao tác nghiệp vụ
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private m_oBusinessObject As BL.clsBLBase
    Public Property BusinessObject() As BL.clsBLBase
        Get
            Return m_oBusinessObject
        End Get
        Set(ByVal value As BL.clsBLBase)
            m_oBusinessObject = value
        End Set
    End Property

    ''' <summary>
    ''' Thuộc tính lưu đối tượng truyền dữ liệu vào control
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private m_bsFMS As BindingSource
    Public Property bsFMS() As BindingSource
        Get
            Return m_bsFMS
        End Get
        Set(ByVal value As BindingSource)
            m_bsFMS = value
        End Set
    End Property
#End Region

#Region "Method"

#Region "Overridable"

    ''' <summary>
    ''' Sub đưa dữ liệu hiển thị trên control
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Protected Overridable Sub BindingControl()
    End Sub

    ''' <summary>
    ''' Sub xóa binding dữ liệu trên control
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Protected Overridable Sub ClearDataBingding()
    End Sub

    ''' <summary>
    ''' Sub set thuộc tính cho các control là read only hay không
    ''' </summary>
    ''' <param name="isReadOnly">Ở chế độ read only thì đặt là true và ngược lại</param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Protected Overridable Sub SetControlEditable(ByVal isReadOnly As Boolean)
        With tbrDataDetail.Tools
            .Item("First").SharedProps.Enabled = isReadOnly
            .Item("Previous").SharedProps.Enabled = isReadOnly
            .Item("Next").SharedProps.Enabled = isReadOnly
            .Item("Last").SharedProps.Enabled = isReadOnly
            .Item("Add").SharedProps.Enabled = isReadOnly
            .Item("Edit").SharedProps.Enabled = isReadOnly
            .Item("Delete").SharedProps.Enabled = isReadOnly
            .Item("View").SharedProps.Enabled = isReadOnly
            .Item("Print").SharedProps.Enabled = isReadOnly
            btnSave.Enabled = Not isReadOnly
            btnCancel.Enabled = Not isReadOnly
        End With
    End Sub

    ''' <summary>
    ''' Sub đặt giá trị cho các trường trước khi lưu dữ liệu
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 26/10/2010</remarks>
    Protected Overridable Sub SetDataValue()
    End Sub

    ''' <summary>
    ''' Sub xác định vị trí của bản ghi hiện thời và load lại dữ liệu
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Protected Overridable Sub RefreshData()
        With tbrDataDetail.Tools
            If bsFMS.Count = 0 Then
                .Item("First").SharedProps.Enabled = False
                .Item("Previous").SharedProps.Enabled = False
                .Item("Next").SharedProps.Enabled = False
                .Item("Last").SharedProps.Enabled = False
                .Item("Add").SharedProps.Enabled = True
                .Item("Edit").SharedProps.Enabled = False
                .Item("Delete").SharedProps.Enabled = False
            ElseIf bsFMS.Count = 1 Then
                .Item("First").SharedProps.Enabled = False
                .Item("Previous").SharedProps.Enabled = False
                .Item("Next").SharedProps.Enabled = False
                .Item("Last").SharedProps.Enabled = False
                .Item("Add").SharedProps.Enabled = True
                .Item("Edit").SharedProps.Enabled = True
                .Item("Delete").SharedProps.Enabled = True
            ElseIf bsFMS.Position = 0 Then
                .Item("First").SharedProps.Enabled = False
                .Item("Previous").SharedProps.Enabled = False
                .Item("Next").SharedProps.Enabled = True
                .Item("Last").SharedProps.Enabled = True
            ElseIf bsFMS.Position = bsFMS.Count - 1 Then
                .Item("First").SharedProps.Enabled = True
                .Item("Previous").SharedProps.Enabled = True
                .Item("Next").SharedProps.Enabled = False
                .Item("Last").SharedProps.Enabled = False
            Else
                .Item("First").SharedProps.Enabled = True
                .Item("Previous").SharedProps.Enabled = True
                .Item("Next").SharedProps.Enabled = True
                .Item("Last").SharedProps.Enabled = True
            End If
        End With
    End Sub

    ''' <summary>
    ''' Sub hiển thị bản báo cáo của bản ghi hiện tại
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 12/10/2010</remarks>
    Protected Overridable Sub ViewDetail()

    End Sub

    ''' <summary>
    ''' Sub in bản ghi hiện tại
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 12/10/2010</remarks>
    Protected Overridable Sub PrintDetail()

    End Sub
#End Region

    ''' <summary>
    ''' Sub xác định trạng thái hoạt động hiện thời
    ''' </summary>
    ''' <param name="isViewMode">Có đang ở chế độ view hay không</param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Protected Sub DisplayMode(ByVal isViewMode As Boolean)
        SetControlEditable(isViewMode)
        If isViewMode Then
            RefreshData()
        Else
            If ActionMode <> clscommon.ActionMode.View Then
                With tbrDataDetail.Tools
                    .Item("View").SharedProps.Enabled = False
                    .Item("Print").SharedProps.Enabled = False
                End With
            End If
            If ActionMode = clscommon.ActionMode.Add Then
                BusinessObject.CurrentRow = BusinessObject.InitNewRow()
                bsFMS.Position = bsFMS.Find(BusinessObject.CurrentRow.Table.PrimaryKey(0).ToString(), BusinessObject.CurrentRow(BusinessObject.CurrentRow.Table.PrimaryKey(0).ToString()))
            End If
        End If
    End Sub

    ''' <summary>
    ''' Sub xác định kiểu thoát
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private Sub IdentifyExitMode()
        If DialogResult = DialogResult.Cancel Then
            If ActionMode = clscommon.ActionMode.Add Or ActionMode = clscommon.ActionMode.Edit Then
                ActionMode = clscommon.ActionMode.View
                BusinessObject.dsFMS.RejectChanges()
            End If
        End If
    End Sub

    ''' <summary>
    ''' hàm lưu dữ liệu vào database (add hoặc edit)
    ''' </summary>
    ''' <remarks>nguyễn huy thường added on 24/10/2010</remarks>
    Protected Overridable Sub SaveData()
        If vldCheckInput.Validate.IsValid Then
            With BusinessObject
                SetDataValue()
                bsFMS.EndEdit()
                Dim DataSaved As Boolean = False
                If .TableName = .dsFMS.Shipment.TableName Or .TableName = .dsFMS.Invoice.TableName Then
                    DataSaved = .SaveMasterDetail()
                Else
                    DataSaved = .AddRecord()
                End If
                If DataSaved Then
                    Dim i As Guid = .CurrentRow.Item(.CurrentRow.Table.PrimaryKey(0).ColumnName)
                    Me.Close()
                    .dsFMS.Tables(.TableName).Clear()
                    .GetData()
                    bsFMS.Position = bsFMS.Find(.CurrentRow.Table.PrimaryKey(0).ColumnName, i.ToString())
                    .CurrentRow = bsFMS.Current.Row
                ElseIf DataSaved = False And (.TableName = .dsFMS.Invoice.TableName Or .TableName = .dsFMS.Shipment.TableName) Then
                    'Hiển thị thông báo lỗi khi không save được (chỉ áp dụng với SaveMasterDetail vì exception đã được xử lý ở DL)
                    clscommon.ShowException(String.Format(My.Resources.SaveError, BusinessObject.IdentifyObject.ToLower))
                End If
            End With
        End If
    End Sub

    ''' <summary>
    ''' Sub xóa bản ghi hiện tại
    ''' </summary>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Friend Sub DeleteCurrentRow()
        Using dlgDeleteValidator As New dlgDeleteValidator() With {.Owner = Me, .BusinessObject = Me.BusinessObject}
            dlgDeleteValidator.lblDeleteValidationMessage.Text = String.Format(My.Resources.DeleteQuestion, BusinessObject.TableName)
            dlgDeleteValidator.ShowDialog()
            If dlgDeleteValidator.DialogResult = Windows.Forms.DialogResult.OK Then
                Dim currentPosition As Integer = bsFMS.Position
                If BusinessObject.DeleteCurrentRow(dlgDeleteValidator.txtDeleteReason.Text) = False Then
                    clscommon.ShowException(String.Format(My.Resources.DeleteError, BusinessObject.TableName))
                End If
                BusinessObject.dsFMS.Tables(BusinessObject.TableName).Clear()
                BusinessObject.GetData()
                RefreshData()
                bsFMS.Position = currentPosition
                Me.Close()
            End If
        End Using
    End Sub

    ''' <summary>
    ''' Hàm xác định bảng làm việc hiện thời có phải là dạng master-detail không
    ''' </summary>
    ''' <returns>Nếu bảng là master-detail thì trả lại true và ngược lại</returns>
    ''' <remarks>Nguyễn Huy Thường added on 05/07/2012</remarks>
    Private Function IsMasterDetail() As Boolean
        With BusinessObject
            If .TableName = .dsFMS.Invoice.TableName Or .TableName = .dsFMS.Shipment.TableName Or .TableName = .dsFMS.Partner.TableName Then
                Return True
            Else
                Return False
            End If
        End With
    End Function
#End Region

#Region "Event"

    ''' <summary>
    ''' Khi hiển thị form thì gọi hàm đưa dữ liệu lên control
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Nguyễn Huy Thường added on 09/06/2011</remarks>
    Private Sub frmBaseDetail_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Try
            If Not Me.DesignMode Then
                DisplayMode(ActionMode = clscommon.ActionMode.View)
                BindingControl()
            End If
        Catch ex As Exception
            clscommon.ShowException(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Khi thoát form thì gọi hàm xác định kiểu thoát
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private Sub frmBaseDetail_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
        Try
            IdentifyExitMode()
        Catch ex As Exception
            clscommon.ShowException(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Xác định hành động khi click vào một item trên toolbar
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private Sub tbrDataDetail_ToolClick(ByVal sender As System.Object, ByVal e As Infragistics.Win.UltraWinToolbars.ToolClickEventArgs) Handles tbrDataDetail.ToolClick
        Try
            Select Case e.Tool.Key
                Case "First"
                    bsFMS.MoveFirst()
                    RefreshData()
                Case "Previous"
                    bsFMS.MovePrevious()
                    RefreshData()
                Case "Next"
                    bsFMS.MoveNext()
                    RefreshData()
                Case "Last"
                    bsFMS.MoveLast()
                    RefreshData()
                Case "Add"
                    ActionMode = clscommon.ActionMode.Add
                    DisplayMode(ActionMode = clscommon.ActionMode.View)
                Case "Edit"
                    ActionMode = clscommon.ActionMode.Edit
                    DisplayMode(ActionMode = clscommon.ActionMode.View)
                Case "Delete"
                    DeleteCurrentRow()
                Case "Close"
                    Me.DialogResult = Windows.Forms.DialogResult.Cancel
                Case "View"
                    ViewDetail()
                Case "Print"
                    PrintDetail()
            End Select
        Catch ex As Exception
            clscommon.ShowException(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Thực hiện việc lưu dữ liệu khi click vào nút save
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private Sub btnSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSave.Click
        Try
            SaveData()
        Catch ex As Exception
            clscommon.ShowException(ex.Message)
        End Try
    End Sub

    ''' <summary>
    ''' Thực hiện việc hủy bỏ các thao tác thêm, sửa khi click vào nút cancel
    ''' </summary>
    ''' <param name="sender"></param>
    ''' <param name="e"></param>
    ''' <remarks>Nguyễn Huy Thường added on 24/10/2010</remarks>
    Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
        Try
            ActionMode = clscommon.ActionMode.View
            BusinessObject.dsFMS.RejectChanges()
        Catch ex As Exception
            clscommon.ShowException(ex.Message)
        End Try
    End Sub

    ' ''' <summary>
    ' ''' Thu nhỏ tất cả các form khác khi form detail bị thu nhỏ
    ' ''' </summary>
    ' ''' <param name="sender"></param>
    ' ''' <param name="e"></param>
    ' ''' <remarks>Nguyễn Huy Thường added on 21/06/2012</remarks>
    'Private Sub frmBaseDetail_Resize(sender As System.Object, e As System.EventArgs) Handles MyBase.Resize
    '    If Me.WindowState = FormWindowState.Minimized Then
    '        Me.Owner.ParentForm.WindowState = FormWindowState.Minimized
    '    End If
    'End Sub
#End Region
End Class